/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.jjsoft.disco.gco.ngc;

import com.jjsoft.disco.gco.dao.GenericController;
import com.jjsoft.disco.gco.mdl.Detallefactura;
import com.jjsoft.disco.gco.mdl.Factura;
import com.jjsoft.disco.gco.mdl.Ingrediente;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Johnny
 */
public class FacturaManager {

    GenericController<Factura> controladorFactura = new GenericController<Factura>();
    GenericController<Detallefactura> controladorDetalle = new GenericController<Detallefactura>();

    public void crearFactura(Factura factura) {
        controladorFactura.create(factura);
    }

    public Factura buscarPorNumero(int numero) {
        try {
            Factura factura = controladorFactura.find(new Factura(), numero);
            return factura;
        } catch (Exception ex) {
            return null;
        }
    }
    
    public List<Detallefactura> buscarDetalles(Date fecha1, Date fecha2, int barra)
    {
        List<Detallefactura> listaDetalle = new ArrayList<Detallefactura>();
        String fec1 = (fecha1.getYear()+1900)+"-"+(fecha1.getMonth()+1)+"-"+fecha1.getDate()+" 0:00:00";
        String fec2 = (fecha2.getYear()+1900)+"-"+(fecha2.getMonth()+1)+"-"+fecha2.getDate()+" 23:59:59";
        try{
            
            List<Factura> listaFacturas = controladorFactura.findWhere(new Factura(), "fecha>='"+fec1+"' and fecha<='"+ fec2+"'");
            if(listaFacturas!=null)
            {
                for(int i = 0; i<listaFacturas.size();i++)
                {
                    for(int j=0;j<listaFacturas.get(i).getDetallefacturaList().size();j++)
                    {
                        if(barra==0 || listaFacturas.get(i).getDetallefacturaList().get(j).getBarra()==barra)
                        {
                            listaFacturas.get(i).getDetallefacturaList().get(j).setFecha(listaFacturas.get(i).getFecha());
                            listaDetalle.add(listaFacturas.get(i).getDetallefacturaList().get(j));
                        }
                    }
                }
            }
            return listaDetalle;
        }
        catch(Exception ex)
        {
            return null;
        }
    }
    public double buscarIva(Date fecha1, Date fecha2, int barra)
    {
        String fec1 = (fecha1.getYear()+1900)+"-"+(fecha1.getMonth()+1)+"-"+fecha1.getDate();
        String fec2 = (fecha2.getYear()+1900)+"-"+(fecha2.getMonth()+1)+"-"+fecha2.getDate();
        try{
            
            List<Factura> listaFacturas = controladorFactura.findWhere(new Factura(), "fecha>='"+fec1+"' and fecha<='"+ fec2+"'");
            double totalIva=0;
            if(listaFacturas!=null)
            {
                
                for(int i = 0; i<listaFacturas.size();i++)
                {
                    for(int j=0;j<listaFacturas.get(i).getDetallefacturaList().size();j++)
                    {
                        if(barra==0 || listaFacturas.get(i).getDetallefacturaList().get(j).getBarra()==barra)
                        {
                            totalIva+=listaFacturas.get(i).getIva();
                        }
                    }
                }
                
            }
            return totalIva;
            
        }
        catch(Exception ex)
        {
            return 0;
        }
    }
    public double buscarCover(Date fecha1, Date fecha2, int barra)
    {
        String fec1 = (fecha1.getYear()+1900)+"-"+(fecha1.getMonth()+1)+"-"+fecha1.getDate();
        String fec2 = (fecha2.getYear()+1900)+"-"+(fecha2.getMonth()+1)+"-"+fecha2.getDate();
        try{
            
            List<Factura> listaFacturas = controladorFactura.findWhere(new Factura(), "fecha between '"+fec1+"' and '"+fec2+"'");
            double totalCover=0;
            if(listaFacturas!=null)
            {
                
                for(int i = 0; i<listaFacturas.size();i++)
                {
                    for(int j=0;j<listaFacturas.get(i).getDetallefacturaList().size();j++)
                    {
                        if(barra==0 || listaFacturas.get(i).getDetallefacturaList().get(j).getBarra()==barra)
                        {
                            if(listaFacturas.get(i).getCoverh()!=null && listaFacturas.get(i).getCoverm()!=null)
                            totalCover+=listaFacturas.get(i).getCoverh()+listaFacturas.get(i).getCoverm();
                        }
                    }
                }
                
            }
            return totalCover;
            
        }
        catch(Exception ex)
        {
            return 0;
        }
    }
    public void editarFactura(Factura factura, List<Detallefactura> listaDetalleGuardar, List<Detallefactura> vendidosRecientes) {
        try {
            List<Detallefactura> listaDetalles = controladorDetalle.findWhere(new Detallefactura(), "numero=" + factura.getNumero());
            if (listaDetalles != null && !listaDetalles.isEmpty()) {
                for (int i = 0; i < listaDetalles.size(); i++) {
                    controladorDetalle.destroy(new Detallefactura(), listaDetalles.get(i).getIddetalleFactura());
                }
            }

            factura.setDetallefacturaList(null);
            controladorFactura.edit(factura);
            for (int i = 0; i < listaDetalleGuardar.size(); i++) {
                listaDetalleGuardar.get(i).setNumero(factura);
                listaDetalleGuardar.get(i).setIddetalleFactura(null);
                controladorDetalle.create(listaDetalleGuardar.get(i));
            }
            for (int i = 0; i < vendidosRecientes.size(); i++) {
                if (vendidosRecientes.get(i).getIdArticulo().getTipo() == 0) {
                    new ProductoBarraManager().restarStockBarra(vendidosRecientes.get(i).getIdArticulo(), vendidosRecientes.get(i).getBarra(), vendidosRecientes.get(i).getCantidad());
                }else
                {
                    System.out.print("restar de coctel");
                    List<Ingrediente> ingredientes = vendidosRecientes.get(i).getIdArticulo().getIngredienteList1();
                    for(int j=0;j<ingredientes.size();j++)
                    {  
                         double cantidad=ingredientes.get(j).getIdUnidadMedida().getOnzas()*ingredientes.get(j).getCantidad();
                         double cantRestar = cantidad*vendidosRecientes.get(i).getCantidad();
                         double cantidadTotal = cantRestar/ingredientes.get(j).getIdIngredienteProducto().getCapacidad();
                         new ProductoBarraManager().restarStockBarra(ingredientes.get(j).getIdIngredienteProducto(),vendidosRecientes.get(i).getBarra(),cantidadTotal);
                         //double 
                    }
                }
            }
            
        } catch (Exception ex) {
            Logger.getLogger(FacturaManager.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void registrarSalida(Factura factura) {
        try {
            factura.setEstado(1);
            controladorFactura.edit(factura);
        } catch (Exception ex) {
            Logger.getLogger(FacturaManager.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public Factura buscarPorNumeroIngreso(int numIngreso) {
        try {
            Factura factura = controladorFactura.findWhere(new Factura(), "numeroIngreso=" + numIngreso).get(0);
            return factura;
        } catch (Exception ex) {
            return null;
        }
    }
}
